#include <stdio.h>
#include <stdlib.h>

#define N 1000

int find_divisors(int, int**);

/**
 * 题目：一个数如果恰好等于它的因子之和，这个数就称为"完数"，例如 6=1＋2＋3 ，请编程找出 1000 以内的所有完数。
 * 
*/
int main(int argc, char const *argv[])
{
    int n;

    printf("完数:\n");
    for (n = 2; n <= N; ++n)
    {
        int *divisors;
        int s = find_divisors(n, &divisors);
        
        // 如果当前数是完美数（因数和等于数本身
        if (s == n)
        {
            printf("%d=%d", n, divisors[0]);
            for (int j = 1; divisors[j] != 0; ++j)  // 输出所有因数
            {
                printf("+%d", divisors[j]);
            }
            
            printf("\n");
        }

        free(divisors);     // 释放动态分配的内存
    }
    
    return 0;
}

int find_divisors(int num, int **divisors)
{
    int sum = 1;    // 初始化因数和为1（1是所有数的因数）
    int count = 1;  // 初始化因数计数
    *divisors = (int*)malloc(num * sizeof(int));    // 动态分配内存存储因数
    //初始化
    for(int i = 0; i < num; i++)
    {
        (*divisors)[i] = 0;
    }

    (*divisors)[0] = 1;

    for (int i = 2; i <= num/2; i++)
    {
        if (num % i == 0)
        {
            sum += i;
            (*divisors)[count++] = i;
        }
    } 

    return sum;  
}